
"""
    super()是super(ClassName, self)的缩写
    super().add(m) 会从MRO列表中开始从ClassName往后查找
    例：
        在class D(B, C)中 super().add(m)  == super(D, self).add(m)
                                                    从而使得直接跳转到class B(A)中的add方法，但是父类调用add方法的self却是紫烈的实例，从而导致在
                                                    class B(A)中，self.n的值为class D(B, C)的self.n的值为5
"""

class A:
    def __init__(self):
        self.n = 2

    def add(self, m):
        print("self is {0} @A.add".format(self))
        self.n += m


class B(A):
    def __init__(self):
        self.n = 3

    def add(self, m):
        print("self is {0} @B.add".format(self))
        super().add(m)   # 此时父类中的self实例是子类的实例
        self.n += 3


class C(A):
    def __init__(self):
        self.n = 4

    def add(self, m):
        print("self is {0} @C.add".format(self))
        super().add(m)  # 此时父类中的self实例是子类的实例
        self.n += 4


class D(B, C):
    def __init__(self):
        self.n = 5

    def add(self, m):
        print("self is {0} @D.add".format(self))
        super().add(m)  # 此时父类中的self实例是子类的实例
        self.n += 5


if __name__ == '__main__':
    d = D()
    d.add(2)
    print(d.n)
